From: Paul Durrant Date: Fri, 8 Jul 2011 07:31:10 +0000 (+0100) Subject: x86/hvm: Don't expose CPUID time leaf when not using PVRDTSCP X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~10068 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/success//%22http:/www.example.com/cgi/success/?a=commitdiff_plain;h=80ecb40362365ba77e68fc609de8bd3b7208ae19;p=xen.git x86/hvm: Don't expose CPUID time leaf when not using PVRDTSCP Some versions of Oracle's Solaris PV drivers make a check that the maximal Xen hypervisor CPUID leaf is <= base leaf + 2 and refuse to work if this is not the case. The addition of the time leaf makes the maximal leaf == base leaf + 3 so this patch introduces a workaround that obscures the time leaf unless PVRDTSCP is in operation. Signed-off-by: Paul Durrant --- diff --git a/xen/arch/x86/traps.c b/xen/arch/x86/traps.c index 28703ec89b..266db18b49 100644 --- a/xen/arch/x86/traps.c +++ b/xen/arch/x86/traps.c @@ -704,15 +704,23 @@ int cpuid_hypervisor_leaves( uint32_t idx, uint32_t sub_idx, struct domain *d = current->domain; /* Optionally shift out of the way of Viridian architectural leaves. */ uint32_t base = is_viridian_domain(d) ? 0x40000100 : 0x40000000; + uint32_t limit; idx -= base; - if ( idx > 3 ) + + /* + * Some Solaris PV drivers fail if max > base + 2. Help them out by + * hiding the PVRDTSCP leaf if PVRDTSCP is disabled. + */ + limit = (d->arch.tsc_mode < TSC_MODE_PVRDTSCP) ? 2 : 3; + + if ( idx > limit ) return 0; switch ( idx ) { case 0: - *eax = base + 3; /* Largest leaf */ + *eax = base + limit; /* Largest leaf */ *ebx = XEN_CPUID_SIGNATURE_EBX; *ecx = XEN_CPUID_SIGNATURE_ECX; *edx = XEN_CPUID_SIGNATURE_EDX;